'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.03
 * lastUpdateDate：2018.02.03
 * description：ES6中Javascript面向对象语法糖写法
 */

/**
 * 1.在传统的JS面向对象不够语义话，ES6规范了这个标准
 * 2.在传统的JS面向对象里，我们知道类和构造器就是一个东西，这显然太扯蛋了
 * 3.闲话不多说，直接来个例子吧
 * 4.在ES6里面JS面向对象的写法更加接近语义话，形成了一种标准，采用语法糖的形式
 */
// 父类
class User {
    // 父类构造器
    constructor (name, gender, age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    // 父类静态方法
    static getStaticMethod () {
        return 'User';
    }

    // 父类方法
    changeName (name) {
        this.name = name;
    }

    changeGender (gender) {
        this.gender = gender;
    }

    changeAge (age) {
        this.age = age;
    }

    // 取值方法
    get info () {
        return 'name:' + this.name + ' | gender:' + this.gender + ' | age:' + this.age;
    }
}

var user = new User('allen', '男', 16);
console.log(user);
user.changeName('xiaokaykay');
console.log(user.name);
console.log(user.info);

class Manager extends User {
    constructor (name, gender, age, password) {
        /**
         * 第一行必须写它，它要先创建父类的对象，然后所有的静态方法、
         * 原型方法和属性才会加到父类创建的那个对象上
         */
        super(name, gender, age);
        this.password = password;
    }

    changePassword (password) {
        this.password = password;
    }

    get info () {
        var info = super.info;
        console.log(info);
        return '****User****' + ' ' + info + ' ' + '****User****';
    }
}

console.log(typeof User, typeof Manager);
var manager = new Manager('aaaaaaaa', '女', '9', '123');
manager.changeName('bbbbbbbb');
console.log(manager.name);
// 先调用父类的取值方法，再返回我们新添加的......
console.log(manager.info);
console.log(manager);

class Test extends User {
    /**
     * 一个子类默认继承一个父类，它默认会继承它的constructor，也就是
     * 它的静态方法、原型方法和属性等等
     */
    constructor (...args) {
        super(...args);
    }
}

var test = new Test('xixi', '男', 22);
console.log('test ---> ' + test.name);
